package 多线程高并发;

public class WeakReference {
    public static void main(String[] args) {
        /**
         * 在线程中创建ThreadLocal  变量名称t1 并执行t1.set()
         * 执行set 方法时，先createMap ；此时线程中t1 强引用ThreadLocal对象，线程中 threadlocals 指向 ThreadlocalMap
         * 初始化ThreadLocalMap 时，将kv 封装成Entry ;其中k 指向了ThreadLocal对象 v 是我们的赋值
         * 并且Entry 继承weakReferecne  导致map 中k 关联ThreadLocal 对象时弱引用
         *
         *我们项目中一般使用线程池，会存在t1 强引用没有了，但是threadlocals 还是强关联着 ThreadLocalMap 不会回收；key 弱引用指向ThreadLocal对象；导致ThreadLocal对象 不会回收
         * 根据弱引用的特性，经历一次GC就会被回收；所以哪怕没有手动remove 此时key 指向null ; 工具帮我们尽可能较少内存泄漏
         * 但是value 还存在泄漏； 所以在程序中一定执行remove 方法ß
         *
         */


        java.lang.ref.WeakReference<M> mWeakReference = new java.lang.ref.WeakReference<>(new M());
        System.out.println(mWeakReference.get());
        System.gc();
        System.out.println(mWeakReference.get());


        ThreadLocal tl = new ThreadLocal();
        tl.set(new M());
        tl.remove();
    }
}
